<?php

/**
 * FuncaoService
 *
 * Acessa o Dao e o Repositorio de Funcao e disponibiliza a outras
 * classes metodos (Servicos) que precisam.
 *
 */
class FuncaoService extends Model {

    /**
     * @var FuncaoDao
     */
    private $funcaoDao;
    /**
     * @var UsuarioService
     */
    private $usuarioService;
    /**
     * @var PerfilService
     */
    private $perfilService;

    public function injectDependencies() {
        $this->funcaoDao = FuncaoDao::getInstance();
        $this->usuarioService = UsuarioService::getInstance();
        $this->perfilService = PerfilService::getInstance();
    }

    /**
     * @method  findAllPositions
     *
     * Lista todas as funcoes do sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  array
     * @since   2012-01-04
     */
    public function findAll() {
        $ArPositions = $this->funcaoDao->findAll();
        $this->fillPosition($ArPositions);
        return $ArPositions;
    }

    //07-04
    public function findById($IDFuncao) {
        $Position = $this->funcaoDao->findById($IDFuncao);
        $this->fillPosition($Position);
        return $Position;
    }

    public function findSimpleById($IDFuncao) {
        return $this->funcaoDao->findSimpleById($IDFuncao);
    }

    public function save($StFuncao) {
        return $this->funcaoDao->save($StFuncao);
    }

    //02-06
    public function update($ArDados) {
        if( !$this->funcaoDao->update($ArDados) ) {
            return false;
        }
        if( $ArDados['IDFuncao'] == Dracosys::getLoggedUser()->getTPerfil()->getFuncao()->getIDFuncao() ) {
            $this->usuarioService->reload();
        }
        return true;
    }

    public function delete($IDFuncao, $ArChangeProfilesUsers) {
        if( !empty($ArChangeProfilesUsers) && !$this->perfilService->changePosition($ArChangeProfilesUsers) ) {
            return new Retorno('Ocorreu um erro ao realizar as trocas de Funções os Perfis.');
        }
        $BoReturn = $this->funcaoDao->delete($IDFuncao);
        if( $BoReturn && $IDFuncao == Dracosys::getLoggedUser()->getTPerfil()->getFuncao()->getIDFuncao() ) {
            $this->usuarioService->reload();
        }
        return $BoReturn ? new Retorno('Função deletada com sucesso.', 1) : new Retorno('Ocorreu um erro na hora de deletar a Função.') ;
    }

    private function fillPosition(&$MxPosition) {
        if (!empty($MxPosition)) {
            $this->fillPositionWithEmployees($MxPosition);
        }
    }

    public function fillPositionWithEmployees(&$MxPosition) {
        if (!is_array($MxPosition)) {
            $MxPosition->setArUsuario($this->usuarioService->findByPosition($MxPosition->getIDFuncao()));
            return;
        }
        foreach ($MxPosition as &$Funcao) {
            $Funcao->setArUsuario($this->usuarioService->findByPosition($Funcao->getIDFuncao()));
        }
    }

}

?>
